Node.js Test Runner

Node.js

Node.js টেস্ট রানার পরিচিতি

অন্তর্নির্মিত নোড:টেস্ট মডিউল সরাসরি Node.js-এ জাভাস্ক্রিপ্ট পরীক্ষা লেখার এবং চালানোর জন্য একটি হালকা, নির্ভরতা-মুক্ত ফ্রেমওয়ার্ক প্রদান করে।

Node.js 20 API , , .

💡দ্রষ্টব্য:

Node.js Test Runner Node.js v20 . .

মূল বৈশিষ্ট্য

মূল দক্ষতা

শূন্য কনফিগারেশন

সেটআপ ছাড়াই বাক্সের বাইরে কাজ করে

ডুয়াল ভলিউম সমর্থন

নেটিভ ESM এবং CommonJS সামঞ্জস্য

সমান্তরাল প্রক্রিয়াকরণ

পরীক্ষাগুলি ডিফল্টরূপে একযোগে চলে

পরীক্ষা বিচ্ছিন্নতা

প্রতিটি পরীক্ষা তার নিজস্ব পরিবেশে চলে

উন্নত বৈশিষ্ট্য

অ্যাসিঙ্ক্রোনাস সমর্থন:একটি প্রথম-শ্রেণীর অ্যাসিঙ্ক/ওয়েট হ্যান্ডলার
পরীক্ষার হুক:সেটআপ/বিচ্ছিন্ন করার জন্য সামনে/পিছনের হুক
উপহাস করা:অন্তর্নির্মিত পরীক্ষা কপি এবং মনিটর
কোড কভারেজ: Node.js

কিভাবে শুরু করবেন

আপনার প্রথম পরীক্ষা লিখছেন

Node.js Test Runner .

আপনার অবশ্যই Node.js 16.17.0 বা উচ্চতর ইনস্টল থাকতে হবে।

1. একটি পরীক্ষা ফাইল তৈরি করুন (test/example.test.js)

// Load the test module
const test = require('node:test');
// Use strict assertion mode for better error messages
const assert = require('node:assert/strict');

// Simple synchronous test
test('basic arithmetic', (t) => {
  // Assert that 1 + 1 equals 2
  assert.equal(1 + 1, 2, '1 + 1 should equal 2');

  // Deep equality check for objects/arrays
  assert.deepEqual(
    { a: 1, b: { c: 2 } },
    { a: 1, b: { c: 2 } }
  );
});

// Asynchronous test with async/await
test('async test', async (t) => {
  const result = await Promise.resolve('async result');
  assert.strictEqual(result, 'async result');
});

2. পরীক্ষা চালান

# Run all test files in the test directory
node --test

# Run a specific test file
node --test test/example.test.js

# Run with coverage reporting
NODE_V8_COVERAGE=coverage node --test

পরীক্ষামূলক কাঠামো এবং সেটিং

বড় প্রকল্পগুলির জন্য, একটি কাঠামোগত উপায়ে আপনার পরীক্ষাগুলি সেট আপ করুন:

project/
├── src/
│   ├── math.js
│   └── utils.js
└── test/
    ├── unit/
    │   ├── math.test.js
    │   └── utils.test.js
    └── integration/
        └── api.test.js

টেস্ট হুক

পরীক্ষার পরিবেশ সেট আপ এবং পরিষ্কার করতে হুক ব্যবহার করুন:

const { test, describe, before, after, beforeEach, afterEach } = require('node:test');
const assert = require('node:assert/strict');

describe('Test Suite with Hooks', (t) => {
  let testData = [];

  // Runs once before all tests
  before(() => {
    console.log('Running before all tests');
    testData = [1, 2, 3];
  });

  // Runs before each test
  beforeEach((t) => {
    console.log('Running before each test');
  });

  test('array length', () => {
    assert.strictEqual(testData.length, 3);
  });

  // Runs after each test
  afterEach(() => {
    console.log('Running after each test');
  });

  // Runs once after all tests
  after(() => {
    console.log('Running after all tests');
    testData = [];
  });
});

লেখার পরীক্ষা

অ্যাসিঙ্ক্রোনাস পরীক্ষা

অ্যাসিঙ্ক্রোনাস কোডের জন্য, একটি অ্যাসিঙ্ক পরীক্ষা ফাংশন ব্যবহার করুন:

import test from 'node:test';
import assert from 'node:assert/strict';

// Using async/await
test('async test', async () => {
  // Simulate async operation
  const result = await Promise.resolve(42);
  assert.equal(result, 42);
});

// Using callbacks with done (older style)
test('callback test', (t, done) => {
  setTimeout(() => {
    assert.equal(1 + 1, 2);
    done();
  }, 100);
});

নেস্টেড টেস্ট

সাবটেস্টগুলি সম্পর্কিত পরীক্ষাগুলি সংগঠিত করতে ব্যবহার করা যেতে পারে:

import test from 'node:test';
import assert from 'node:assert/strict';

test('math operations', async (t) => {
  await t.test('addition', () => {
    assert.equal(1 + 1, 2);
  });
  
  await t.test('multiplication', () => {
    assert.equal(2 * 3, 6);
  });
  
  await t.test('division', () => {
    assert.equal(10 / 2, 5);
  });
});

পরিহার এবং TODO পরীক্ষা

পরীক্ষাগুলি এড়িয়ে যাওয়া বা TODO হিসাবে চিহ্নিত করা যেতে পারে:

import test from 'node:test';

// Skip this test
test('skipped test', { skip: true }, () => {
  // This won't run
});

// Skip with a reason
test('skipped with reason', { skip: 'working on this later' }, () => {
  // This won't run
});

// Mark as TODO
test('todo test', { todo: true }, () => {
  // This won't run, but will be reported as TODO
});

// Conditional skip
test('conditional skip', { skip: process.platform === 'win32' }, () => {
  // This will be skipped on Windows
});

নিশ্চিতকরণ

Node.js Test Runner assert . , assert/strict .

সাধারণ নিশ্চিতকরণ

import assert from 'node:assert/strict';

// Equality checks
assert.equal(1, 1);                 // Loose equality (==)
assert.strictEqual(1, 1);           // Strict equality (===)
assert.deepEqual({a: 1}, {a: 1});   // Deep equality for objects
assert.deepStrictEqual({a: 1}, {a: 1}); // Strict deep equality

// Truthiness checks
assert.ok(true);                    // Checks if value is truthy
assert.ok(1);                       // Also truthy

// Comparing values
assert.notEqual(1, 2);              // Check inequality
assert.notStrictEqual(1, '1');      // Check strict inequality

// Throwing errors
assert.throws(() => { throw new Error('Boom!'); }); // Check if function throws
assert.doesNotThrow(() => { return 42; });         // Check if no error thrown

// Async assertions
await assert.rejects(               // Check if Promise rejects
  async () => { throw new Error('Async boom!'); }
);

উপহাস নিয়ে কাজ করা

Node.js Test Runner , :

পরীক্ষার অনুলিপি প্রদানের জন্য নির্ভরশীল ইনজেকশন ব্যবহার করা যেতে পারে
সহজ উপহাস ফাংশন এবং বস্তু তৈরি করা যেতে পারে
প্রয়োজনে তৃতীয় পক্ষের উপহাস লাইব্রেরির সাথে একীভূত করে

একটি সহজ উপহাস উদাহরণ

import test from 'node:test';
import assert from 'node:assert/strict';

// Function we want to test
function processUser(user, logger) {
  if (!user.name) {
    logger.error('User has no name');
    return false;
  }
  logger.info(`Processing user: ${user.name}`);
  return true;
}

// Test with a mock logger
test('processUser logs correctly', () => {
  // Create a mock logger
  const mockCalls = [];
  const mockLogger = {
    error: (msg) => mockCalls.push(['error', msg]),
    info: (msg) => mockCalls.push(['info', msg])
  };
  
  // Test with valid user
  const validResult = processUser({name: 'Alice'}, mockLogger);
  assert.strictEqual(validResult, true);
  assert.deepStrictEqual(mockCalls[0], ['info', 'Processing user: Alice']);
  
  // Reset mock calls
  mockCalls.length = 0;
  
  // Test with invalid user
  const invalidResult = processUser({}, mockLogger);
  assert.strictEqual(invalidResult, false);
  assert.deepStrictEqual(mockCalls[0], ['error', 'User has no name']);
});

বাস্তব উদাহরণ পরীক্ষা করা

একটি অ্যাপ্লিকেশন ফাংশন পরীক্ষা করা হচ্ছে

utils.js

exports.formatPrice = function(price) {
  if (typeof price !== 'number' || isNaN(price)) {
    throw new Error('Price must be a valid number');
  }
  return `$${price.toFixed(2)}`;
};

utils.test.js

const test = require('node:test');
const assert = require('node:assert/strict');
const { formatPrice } = require('./utils');

// Test cases
test('formatPrice formats numbers as currency strings', (t) => {
  assert.equal(formatPrice(10), '$10.00');
  assert.equal(formatPrice(10.5), '$10.50');
  assert.equal(formatPrice(0), '$0.00');
});

// Test for error
test('formatPrice throws error for invalid inputs', (t) => {
  assert.throws(() => formatPrice('not a number'), {
    message: 'Price must be a valid number'
  });
  assert.throws(() => formatPrice(NaN));
  assert.throws(() => formatPrice());
});

উন্নত কনফিগারেশন

স্বতন্ত্র সাংবাদিক

পরীক্ষার ফলাফলের জন্য বিভিন্ন আউটপুট বিন্যাস নির্দিষ্ট করা যেতে পারে:

node --test --test-reporter=spec

উপলব্ধ রিপোর্টার:

spec- বিস্তারিত শ্রেণিবিন্যাস দৃশ্য
dot- ন্যূনতম পয়েন্ট আউটপুট
tap- যেকোনো কিছুর প্রোটোকল বিন্যাস পরীক্ষা করুন
junit- JUnit XML বিন্যাস

ফিল্টারিং পরীক্ষা

চালানোর জন্য পরীক্ষাগুলি ফিল্টার করুন:

node --test --test-name-pattern="user"

এটি শুধুমাত্র সেইসব পরীক্ষা চালাবে যেগুলির নামে "ব্যবহারকারী" আছে।

দেখার উপায়

উন্নয়নের জন্য, ফাইল পরিবর্তন হলে স্বয়ংক্রিয়ভাবে রিপ্লে করতে আপনি ঘড়ি মোডে পরীক্ষা চালাতে পারেন:

node --test --watch

অন্যান্য পরীক্ষার কাঠামোর সাথে তুলনা

বৈশিষ্ট্য Node.js Test Runner Jest Mocha Vitest
অন্তর্নির্মিত ✅ হ্যাঁ (Node.js 16.17.0+) ❌ না ❌ না ❌ না
শূন্য কনফিগারেশন ✅ হ্যাঁ ✅ হ্যাঁ ❌ সিস্টেম প্রয়োজন ✅ হ্যাঁ
টেস্ট ড্রাইভ Node.js Jest Mocha Vite
নিশ্চিতকরণ লাইব্রেরি node:assert Jest Expect Chai/Sinon ঠাট্টা-সামঞ্জস্যপূর্ণ
সমান্তরাল পরীক্ষা ✅ হ্যাঁ ✅ হ্যাঁ ✅ সাথে --সমান্তরাল ✅ হ্যাঁ
কোড কভারেজ ✅ NODE_V8_COVERAGE সহ ✅ অন্তর্নির্মিত ❌ NYc/ইস্তানবুল প্রয়োজন ✅ অন্তর্নির্মিত
উপহাস ✅ মৌলিক ✅ উন্নত ❌ সিনন প্রয়োজন ✅ উন্নত
দেখার উপায় ✅ হ্যাঁ (--ঘড়ি) ✅ হ্যাঁ ✅ সাথে --ওয়াচ ✅ দ্রুত এইচএমআর
সেরা অন্তর্নির্মিত সমাধান, সহজ পরিকল্পনা সম্পূর্ণ বৈশিষ্ট্যযুক্ত পরীক্ষা নমনীয় পরীক্ষা Vite প্রকল্প, ESM

💡দ্রষ্টব্য:

Node.js Test Runner , - , Node.js . , Jest Mocha .

অনুশীলন করুন

Node.js , : import ______ from 'node:test';

test
✓ ঠিক আছে! Node.js টেস্ট মডিউল আমদানি করতে "'node:test' থেকে পরীক্ষা আমদানি করুন;" ব্যবহার করা হয় এটি পরীক্ষা সংজ্ঞায়িত এবং চালানোর জন্য মৌলিক API প্রদান করে।
jest
✗ ভুল! জেস্ট হল একটি বাহ্যিক পরীক্ষার কাঠামো, Node.js-এর অন্তর্নির্মিত মডিউল নয়।
mocha
✗ ভুল! Mocha হল একটি বাহ্যিক পরীক্ষার কাঠামো, Node.js-এর অন্তর্নির্মিত মডিউল নয়।
assert
✗ ভুল! অ্যাসার্ট মডিউলটি দাবী করার জন্য ব্যবহার করা হয়, তবে পরীক্ষা সংজ্ঞায়িত করার জন্য পরীক্ষা মডিউল প্রয়োজন।